{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#  第七步：重新调整树的数目"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-01-04T07:49:13.393960Z",
     "start_time": "2018-01-04T07:49:12.635407Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/anaconda3/lib/python3.6/site-packages/sklearn/cross_validation.py:41: DeprecationWarning: This module was deprecated in version 0.18 in favor of the model_selection module into which all the refactored classes and functions are moved. Also note that the interface of the new CV iterators are different from that of this module. This module will be removed in 0.20.\n",
      "  \"This module will be removed in 0.20.\", DeprecationWarning)\n"
     ]
    }
   ],
   "source": [
    "from xgboost import XGBClassifier\n",
    "import xgboost as xgb\n",
    "\n",
    "import pandas as pd \n",
    "import numpy as np\n",
    "\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "from sklearn.model_selection import StratifiedKFold\n",
    "\n",
    "from sklearn.metrics import log_loss\n",
    "\n",
    "from matplotlib import pyplot\n",
    "import seaborn as sns\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 读取数据 & 数据探索"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-01-04T07:49:16.730762Z",
     "start_time": "2018-01-04T07:49:15.587118Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>bathrooms</th>\n",
       "      <th>bedrooms</th>\n",
       "      <th>price</th>\n",
       "      <th>price_bathrooms</th>\n",
       "      <th>price_bedrooms</th>\n",
       "      <th>room_diff</th>\n",
       "      <th>room_num</th>\n",
       "      <th>Year</th>\n",
       "      <th>Month</th>\n",
       "      <th>Day</th>\n",
       "      <th>...</th>\n",
       "      <th>walk</th>\n",
       "      <th>walls</th>\n",
       "      <th>war</th>\n",
       "      <th>washer</th>\n",
       "      <th>water</th>\n",
       "      <th>wheelchair</th>\n",
       "      <th>wifi</th>\n",
       "      <th>windows</th>\n",
       "      <th>work</th>\n",
       "      <th>interest_level</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1.5</td>\n",
       "      <td>3</td>\n",
       "      <td>3000</td>\n",
       "      <td>1200.0</td>\n",
       "      <td>750.000000</td>\n",
       "      <td>-1.5</td>\n",
       "      <td>4.5</td>\n",
       "      <td>2016</td>\n",
       "      <td>6</td>\n",
       "      <td>24</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1.0</td>\n",
       "      <td>2</td>\n",
       "      <td>5465</td>\n",
       "      <td>2732.5</td>\n",
       "      <td>1821.666667</td>\n",
       "      <td>-1.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>2016</td>\n",
       "      <td>6</td>\n",
       "      <td>12</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1.0</td>\n",
       "      <td>1</td>\n",
       "      <td>2850</td>\n",
       "      <td>1425.0</td>\n",
       "      <td>1425.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>2016</td>\n",
       "      <td>4</td>\n",
       "      <td>17</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1.0</td>\n",
       "      <td>1</td>\n",
       "      <td>3275</td>\n",
       "      <td>1637.5</td>\n",
       "      <td>1637.500000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>2016</td>\n",
       "      <td>4</td>\n",
       "      <td>18</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1.0</td>\n",
       "      <td>4</td>\n",
       "      <td>3350</td>\n",
       "      <td>1675.0</td>\n",
       "      <td>670.000000</td>\n",
       "      <td>-3.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>2016</td>\n",
       "      <td>4</td>\n",
       "      <td>28</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 228 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   bathrooms  bedrooms  price  price_bathrooms  price_bedrooms  room_diff  \\\n",
       "0        1.5         3   3000           1200.0      750.000000       -1.5   \n",
       "1        1.0         2   5465           2732.5     1821.666667       -1.0   \n",
       "2        1.0         1   2850           1425.0     1425.000000        0.0   \n",
       "3        1.0         1   3275           1637.5     1637.500000        0.0   \n",
       "4        1.0         4   3350           1675.0      670.000000       -3.0   \n",
       "\n",
       "   room_num  Year  Month  Day       ...        walk  walls  war  washer  \\\n",
       "0       4.5  2016      6   24       ...           0      0    0       0   \n",
       "1       3.0  2016      6   12       ...           0      0    0       0   \n",
       "2       2.0  2016      4   17       ...           0      0    0       0   \n",
       "3       2.0  2016      4   18       ...           0      0    0       0   \n",
       "4       5.0  2016      4   28       ...           0      0    1       0   \n",
       "\n",
       "   water  wheelchair  wifi  windows  work  interest_level  \n",
       "0      0           0     0        0     0               1  \n",
       "1      0           0     0        0     0               2  \n",
       "2      0           0     0        0     0               0  \n",
       "3      0           0     0        0     0               2  \n",
       "4      0           0     0        0     0               2  \n",
       "\n",
       "[5 rows x 228 columns]"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dpath = './data/'\n",
    "data = pd.read_csv(dpath + 'RentListingInquries_FE_train.csv')\n",
    "data.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-01-04T07:49:18.860489Z",
     "start_time": "2018-01-04T07:49:17.310979Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>bathrooms</th>\n",
       "      <th>bedrooms</th>\n",
       "      <th>price</th>\n",
       "      <th>price_bathrooms</th>\n",
       "      <th>price_bedrooms</th>\n",
       "      <th>room_diff</th>\n",
       "      <th>room_num</th>\n",
       "      <th>Year</th>\n",
       "      <th>Month</th>\n",
       "      <th>Day</th>\n",
       "      <th>...</th>\n",
       "      <th>virtual</th>\n",
       "      <th>walk</th>\n",
       "      <th>walls</th>\n",
       "      <th>war</th>\n",
       "      <th>washer</th>\n",
       "      <th>water</th>\n",
       "      <th>wheelchair</th>\n",
       "      <th>wifi</th>\n",
       "      <th>windows</th>\n",
       "      <th>work</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1.0</td>\n",
       "      <td>1</td>\n",
       "      <td>2950</td>\n",
       "      <td>1475.000000</td>\n",
       "      <td>1475.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>2016</td>\n",
       "      <td>6</td>\n",
       "      <td>11</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1.0</td>\n",
       "      <td>2</td>\n",
       "      <td>2850</td>\n",
       "      <td>1425.000000</td>\n",
       "      <td>950.000000</td>\n",
       "      <td>-1.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>2016</td>\n",
       "      <td>6</td>\n",
       "      <td>24</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1.0</td>\n",
       "      <td>1</td>\n",
       "      <td>3758</td>\n",
       "      <td>1879.000000</td>\n",
       "      <td>1879.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>2016</td>\n",
       "      <td>6</td>\n",
       "      <td>3</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1.0</td>\n",
       "      <td>2</td>\n",
       "      <td>3300</td>\n",
       "      <td>1650.000000</td>\n",
       "      <td>1100.000000</td>\n",
       "      <td>-1.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>2016</td>\n",
       "      <td>6</td>\n",
       "      <td>11</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>2.0</td>\n",
       "      <td>2</td>\n",
       "      <td>4900</td>\n",
       "      <td>1633.333333</td>\n",
       "      <td>1633.333333</td>\n",
       "      <td>0.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>2016</td>\n",
       "      <td>4</td>\n",
       "      <td>12</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 227 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   bathrooms  bedrooms  price  price_bathrooms  price_bedrooms  room_diff  \\\n",
       "0        1.0         1   2950      1475.000000     1475.000000        0.0   \n",
       "1        1.0         2   2850      1425.000000      950.000000       -1.0   \n",
       "2        1.0         1   3758      1879.000000     1879.000000        0.0   \n",
       "3        1.0         2   3300      1650.000000     1100.000000       -1.0   \n",
       "4        2.0         2   4900      1633.333333     1633.333333        0.0   \n",
       "\n",
       "   room_num  Year  Month  Day  ...   virtual  walk  walls  war  washer  water  \\\n",
       "0       2.0  2016      6   11  ...         0     0      0    0       0      0   \n",
       "1       3.0  2016      6   24  ...         0     0      0    1       0      0   \n",
       "2       2.0  2016      6    3  ...         0     0      0    0       0      0   \n",
       "3       3.0  2016      6   11  ...         0     0      0    0       0      0   \n",
       "4       4.0  2016      4   12  ...         0     0      0    1       0      0   \n",
       "\n",
       "   wheelchair  wifi  windows  work  \n",
       "0           0     0        0     0  \n",
       "1           0     0        0     0  \n",
       "2           0     0        0     0  \n",
       "3           1     0        0     0  \n",
       "4           0     0        0     0  \n",
       "\n",
       "[5 rows x 227 columns]"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "target = pd.read_csv(dpath + 'RentListingInquries_FE_test.csv')\n",
    "target.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-01-04T07:49:19.672837Z",
     "start_time": "2018-01-04T07:49:19.463763Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/anaconda3/lib/python3.6/site-packages/pandas/core/indexing.py:517: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame.\n",
      "Try using .loc[row_indexer,col_indexer] = value instead\n",
      "\n",
      "See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy\n",
      "  self.obj[item] = s\n"
     ]
    }
   ],
   "source": [
    "def remove_noise(df):\n",
    "#remove some noise\n",
    "    df= df[df.price < 10000]\n",
    "\n",
    "    df.loc[df[\"bathrooms\"] == 112, \"bathrooms\"] = 1.5\n",
    "    df.loc[df[\"bathrooms\"] == 10, \"bathrooms\"] = 1\n",
    "    df.loc[df[\"bathrooms\"] == 20, \"bathrooms\"] = 2\n",
    "    return df\n",
    "data = remove_noise(data)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 特征编码"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-01-04T07:49:21.712524Z",
     "start_time": "2018-01-04T07:49:21.651371Z"
    },
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "y_train = data['interest_level']\n",
    "X_train = data.drop('interest_level',axis=1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 数据预处理"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-01-04T07:49:23.685282Z",
     "start_time": "2018-01-04T07:49:23.384229Z"
    },
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# 数据标准化 \n",
    "from sklearn.preprocessing import StandardScaler\n",
    "\n",
    "# 初始化特征的标准化器\n",
    "ss_X = StandardScaler()\n",
    "\n",
    "# 分别对训练和测试数据的特征进行标准化处理\n",
    "X_train = ss_X.fit_transform(X_train)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 模型训练"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-01-04T07:49:25.266069Z",
     "start_time": "2018-01-04T07:49:25.238407Z"
    },
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "kfold = StratifiedKFold(n_splits=5, shuffle=True, random_state=3)\n",
    "kfold = list(kfold.split(X_train,y_train))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-01-04T07:49:26.753234Z",
     "start_time": "2018-01-04T07:49:26.735661Z"
    },
    "run_control": {
     "marked": true
    }
   },
   "outputs": [],
   "source": [
    "def modelfit(alg, X_train, y_train, cv_folds=None, early_stopping_rounds=100):\n",
    "    xgb_param = alg.get_xgb_params()\n",
    "    xgb_param['num_class'] = 9\n",
    "\n",
    "    xgtrain = xgb.DMatrix(X_train, label = y_train)\n",
    "\n",
    "    cvresult = xgb.cv(xgb_param, xgtrain, num_boost_round=alg.get_params()['n_estimators'], folds =cv_folds,\n",
    "                     metrics='mlogloss', early_stopping_rounds=early_stopping_rounds)\n",
    "\n",
    "    cvresult.to_csv('my_preds_6_2_3000.csv', index_label = 'n_estimators')\n",
    "\n",
    "    n_estimators = cvresult.shape[0]\n",
    "    alg.set_params(n_estimators = n_estimators)\n",
    "\n",
    "    #Fit the algorithm on the data\n",
    "    alg.fit(X_train, y_train, eval_metric='mlogloss')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-01-04T10:26:44.599366Z",
     "start_time": "2018-01-04T07:49:31.882238Z"
    }
   },
   "outputs": [],
   "source": [
    "xgb7_1 = XGBClassifier(\n",
    "        learning_rate =0.01,\n",
    "        n_estimators=3000,\n",
    "        max_depth=6,\n",
    "        min_child_weight=2,\n",
    "        gamma=0,\n",
    "        subsample=0.9,\n",
    "        colsample_bytree=0.6,\n",
    "        colsample_bylevel = 0.7,\n",
    "        objective= 'multi:softprob',\n",
    "        reg_alpha= 2,\n",
    "        reg_lambda= 0.5,\n",
    "        seed=3)\n",
    "\n",
    "modelfit(xgb7_1, X_train, y_train, cv_folds = kfold)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-01-04T10:26:45.278460Z",
     "start_time": "2018-01-04T10:26:44.814997Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1a11df2ba8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "cvresult = pd.DataFrame.from_csv('my_preds_6_2_3000.csv')\n",
    "# plot\n",
    "test_means = cvresult['test-mlogloss-mean']\n",
    "test_stds = cvresult['test-mlogloss-std'] \n",
    "\n",
    "train_means = cvresult['train-mlogloss-mean']\n",
    "train_stds = cvresult['train-mlogloss-std'] \n",
    "\n",
    "x_axis = range(0, cvresult.shape[0])\n",
    "pyplot.errorbar(x_axis, test_means, yerr=test_stds ,label='Test')\n",
    "pyplot.errorbar(x_axis, train_means, yerr=train_stds ,label='Train')\n",
    "pyplot.title(\"XGBoost n_estimators vs Log Loss\")\n",
    "pyplot.xlabel( 'n_estimators' )\n",
    "pyplot.ylabel( 'Log Loss' )\n",
    "pyplot.savefig( 'n_estimators_6_2_3000.png' )"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-01-05T00:50:50.614641Z",
     "start_time": "2018-01-05T00:50:50.606190Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "logless on test 0.588803\n",
      "n_estimators is 3000\n"
     ]
    }
   ],
   "source": [
    "print('logless on test',test_means.min())\n",
    "print('n_estimators is',cvresult.shape[0])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "hide_input": false,
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.3"
  },
  "latex_envs": {
   "LaTeX_envs_menu_present": true,
   "autocomplete": true,
   "bibliofile": "biblio.bib",
   "cite_by": "apalike",
   "current_citInitial": 1,
   "eqLabelWithNumbers": true,
   "eqNumInitial": 1,
   "hotkeys": {
    "equation": "Ctrl-E",
    "itemize": "Ctrl-I"
   },
   "labels_anchors": false,
   "latex_user_defs": false,
   "report_style_numbering": false,
   "user_envs_cfg": false
  },
  "nbTranslate": {
   "displayLangs": [
    "*"
   ],
   "hotkey": "alt-t",
   "langInMainMenu": true,
   "sourceLang": "en",
   "targetLang": "fr",
   "useGoogleTranslate": true
  },
  "toc": {
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": "block",
   "toc_window_display": false
  },
  "varInspector": {
   "cols": {
    "lenName": 16,
    "lenType": 16,
    "lenVar": 40
   },
   "kernels_config": {
    "python": {
     "delete_cmd_postfix": "",
     "delete_cmd_prefix": "del ",
     "library": "var_list.py",
     "varRefreshCmd": "print(var_dic_list())"
    },
    "r": {
     "delete_cmd_postfix": ") ",
     "delete_cmd_prefix": "rm(",
     "library": "var_list.r",
     "varRefreshCmd": "cat(var_dic_list()) "
    }
   },
   "types_to_exclude": [
    "module",
    "function",
    "builtin_function_or_method",
    "instance",
    "_Feature"
   ],
   "window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
